import openslide
import os
import numpy as np
import cv2
from tqdm import tqdm

# ==== 参数设置 ====
wsi_path = "D:/zm/PGGN-202119218.svs"     # 输入路径（换成你自己的）
save_dir = "D:/zm/PGGN"        # Patch保存文件夹
# patch_size=256 或 512，根据你后面模型输入来选。
patch_size = 256                        # Patch尺寸，如512x512
step_size = 256                         # 步长，等于patch_size表示无重叠
white_threshold = 0.8                   # 空白区域比例阈值（>0.8视为空白）

# ==== 创建保存路径 ====
os.makedirs(save_dir, exist_ok=True)

# ==== 打开WSI文件 ====
slide = openslide.OpenSlide(wsi_path)
slide_width, slide_height = slide.dimensions
print(f"Slide dimensions: {slide_width} x {slide_height}")

# ==== 开始裁剪 ====
# patch_1024_2048.png 表示裁剪起始位置是（x=1024, y=2048）。
count = 0
for y in tqdm(range(0, slide_height, step_size)):
    for x in range(0, slide_width, step_size):
        # 提取Patch（level 0）
        # level 0：对应 WSI 的 最高分辨率（如 40x 扫描的原生尺寸），扫描仪参数是多大就是多大。
        patch = slide.read_region((x, y), 0, (patch_size, patch_size)).convert("RGB")
        patch_np = np.array(patch)

        # 空白区域判断（利用灰度图）
        gray = cv2.cvtColor(patch_np, cv2.COLOR_RGB2GRAY)
        white_pixel_ratio = np.sum(gray > 220) / (patch_size * patch_size)
        if white_pixel_ratio > white_threshold:
            continue  # 跳过空白区域

        # 保存Patch
        patch.save(os.path.join(save_dir, f"patch_{x}_{y}.png"))
        count += 1

print(f"总共保存了 {count} 个有效 Patch")
